# 7. Mixly 教程

## 开发环境设置

**下载软件:**

读者可以在米思齐(Mixly)网站 [https://mixly.org/bnu-maker/mixl2.0rc](https://mixly.org/bnu-maker/mixl2.0rc) 下载Mixly开发环境，网站页面如下图所示：

![Img](./media/img-20241023112325.png)



点击“Mixly2.0 RC4”进入百度云盘首界面，复制提取码 “<span style="color: rgb(255, 76, 65);">**ny1n**</span>” 至 “**<span style="color: rgb(0, 209, 0);">请输入提取码，不区分大小写</span>**” 的文本框，点击 “**<span style="color: rgb(0, 252, 255);">提取文件</span>**” 进入Mixly软件下载页面，左键单击“mixly2.0”。根据计算机系统选择下载对应的版本，Windows系统一般是下载“**mixly2.0-win32-x64-rc4完整版.zip**”版本，如下图所示。

![Img](./media/img-20241023112426.png)

![Img](./media/img-20241023112552.png)

![Img](./media/img-20241023112601.png)

<span style="color: rgb(255, 76, 65);">Mixly For Windows：</span>

![Img](./media/img-20241023112610.png)

<span style="color: rgb(255, 76, 65);">Mixly For Mac(根据系统选择)：</span>

![Img](./media/img-20241023112618.png)

**安装软件：**

1.Windows版本安装：

下载mixly2.0-win32-x64-rc4完整版压缩包之后，重新命名为mixly2.0 ，右键解压到本地磁盘。

<span style="color: rgb(255, 76, 65);">**特别提醒**：</span>
<br>
<span style="color: rgb(255, 76, 65);">(1)建议解压到硬盘根目录，路径不能包含中文及特殊字符(如:._( )等)。</span>
<br>
<span style="color: rgb(255, 76, 65);">(2)建议安装路径如D:mixly2.0</span> 


因为Mixly是一个绿色免安装软件，所以“**mixly2.0-win32-x64-rc4完整版**”版本在解压之后就可以直接使用了。如果是下载“**一键更新版.7z**”版本的压缩包，压缩包解压后，需要左键双击打开“一键更新.bat”按照提示更新Mixly。

完整的Mixly文件夹中的内容如下图所示：

![Img](./media/img-20241023112829.png)

启动软件：

这里双击“**Mixly.exe**”就能打开Mixly软件。如下图所示：

![Img](./media/img-20241023112918.png)

打开Mixly软件后，找到并且单击“ **<span style="color: rgb(255, 76, 65);">Arduino ESP32</span>** ”就可以进入Mixly编程界面。软件界面如下图所示：

![Img](./media/img-20241023114012.png)

2.Mac版本安装：

这里有MAC安装Mixly2.0.txt文件说明。

![Img](./media/img-20241023112956.png)

<span style="background: rgb(255, 251, 0);">如果米思齐(Mixly)官网网站更新，请通过百度网盘分享的文件：mixly2.0-2024。</span>
<br>
<span style="background: rgb(255, 251, 0);">链接：[https://pan.baidu.com/s/1sV0DUDKg7OiQcKyIkBI1Ew?pwd=keye](https://pan.baidu.com/s/1sV0DUDKg7OiQcKyIkBI1Ew?pwd=keye) </span>
<br>
<span style="background: rgb(255, 251, 0);">提取码：keye </span>


**页面介绍:**

![Img](./media/img-20241023114523.png)

![Img](./media/img-20241023131427.png)

总体来说，Mixly软件界面分为4部分。

1.界面左侧为模块区，这里包含了Mixly中所有能用到的程序模块，根据功能的不同，大概分为以下几类:“输入/输出”、“控制”、“数学”、“逻辑”、“文本”、“数组”、“变量”、“函数”、“串口”、“传感器”、“执行器”、“显示器”、“通信”、“存储”、“网络”。每种类型的模块都用不同的颜色块表示，其中每一个分类中的模块会在附录A中有专门的介绍。

2.模块区的右侧是程序构建区，模块区的模块可通过鼠标拖拽放到程序构建区，拖诟过来的模块会在这里组合成一段有一定逻辑关系的程序块。这个区域有点类似代码程序编辑软件中写代码的地方，在这个区域的右下角有一个垃圾桶，当我们删除模块时，就要将模块拖到垃圾桶中，在垃圾桶的上方有三个圆形的按钮，能够实现程序构建区的放大、缩小以及居中。

3.模块区和程序构建区的上方是基本功能区，类似一般软件的菜单区。这里不仅包含了“新建”、“打开”、“保存”、“另存为”、“导出库”和“管理库”软件都具有的按钮，还包含了硬件编程软件中需要用到的“编译”、“上传”、“控制板选择”、“串口端口”、“串口”这样的按钮。

4.界面的最下方是提示区，这里在软件编译、上传的过程中会显示相应的提示信息。我们可以通过提示信息来解决编译上传过程中出现的一些问题。

<span style="background: rgb(255, 251, 0);">最后还要补充两点：</span><span style="background: rgb(255, 251, 0);"></span>

第一点是 Mixly支持多国语言，我们可以通过如下界面找到并且点击 ![Img](./media/img-20241023132214.png) 进入个性化设置页面，找到语言下面的简体中文下拉菜单，选择不同的语言版本，此时这个下拉菜单显示的是简体中文，如下图所示：

![Img](./media/img-20241023132225.png)

![Img](./media/img-20241023132232.png)

第二点是在界面最上方右侧有一个 ![Img](./media/img-20241023132245.png) 按钮，单击这个按钮就能进入纯代码形式，如下图所示：

![Img](./media/img-20241023132435.png)

Mixly作为一款将图形化编程方式和代码编程方式融合在一起的开发环境，如果只能单独地显示代码或显示图形程序块，那么肯定是不够好的。在Mixly中是能够将代码和图形程序块一起呈现在屏幕上的，这个功能可以通过界面最上方右侧有一个按钮实现，单击这个 ![Img](./media/img-20241023132310.png) 按钮之后，如下图所示：

![Img](./media/img-20241023132515.png)

这时，在程序构建区的右侧会显示出对应的代码，这段代码是与程序构建区中的模块所组成的程序块对应的，会随着模块的变化而变化，不过区域中的代码是不可编辑的。同时，界面最右侧那个向左的箭头按钮变成了向右的箭头。

**<span style="color: rgb(255, 76, 65);">注意：想了解更多关于Mixly相关知识的请点击链接：</span>**[https://mixly.readthedocs.io/zh-cn/latest/](https://mixly.readthedocs.io/zh-cn/latest/) 。

**ESP32主控板驱动程序安装:**

ESP32主控板驱动程序安装方法请参照前面的“<span style="color: rgb(0, 209, 0);">**Arduino C 教程 Windows 系统**</span>”部分，这里就不重复讲解。如果已经安装好了驱动程序，这一步就跳过。

**添加Mixly库文件:**

<span style="color: rgb(255, 76, 65);">注意：Mixly库文件( index 库)必须添加好，否则后面涉及到相关模块的示例代码是打不开的</span>。
<br>
<span style="color: rgb(0, 209, 0); background: rgb(255, 251, 0);">特别提醒：库文件在上面 **<span style="color: rgb(255, 76, 65);">资料下载</span>** 处提供有，请下载并且安装好库文件。</span>
<br>
Mixly软件下载安装后，点击 <span style="color: rgb(255, 76, 65);">Arduino ESP32</span> 进入代码编辑器，先点击右上角“ 设置 ”，再点击“ 管理库 ”进入添加库文件界面。如下图所示：

![Img](./media/img-20241023114012.png)

![Img](./media/img-20241023132829.png)

先点击“ 导入库 ”，再点击 ![Img](./media/img-20241023132850.png) 进入库文件所放的位置，找到 **<span style="color: rgb(255, 76, 65);">index.xml</span>** 库文件并选中它，然后单击“ 确定 ”。之后，就可以看到库文件在导入中，一会儿会出现“导入成功”字样，说明库文件导入成功。如下图所示：

![Img](./media/img-20241031081028.png)

![Img](./media/img-20241031081529.png)

![Img](./media/img-20241031081700.png)


点击“ 管理库 ”，可以看到添加成功的库文件。如下图所示：

![Img](./media/img-20241031081748.png)

关闭添加库文件的窗口界面，在代码编辑器左侧看到所添加的库文件。如下图所示：

![Img](./media/img-20241031081837.png)

**编写代码并上传至 ESP32 主控板:**  （**<span style="color: rgb(255, 76, 65);">后面上传项目代码的步骤也一样，即：同下</span>。**）

确保ESP32主控板与计算机连接成功，然后双击“ **Mixly.exe** ”图标打开Mixly软件。

方法①：从直接拖动代码块到程序构建区进行代码编写，选用管脚IO15，如下图所示：

![Img](./media/img-20241023133629.png)

编写完成后保存到电脑上，单击“ 文件 ”-->“ 另存为 ”，如下图所示：

![Img](./media/img-20241023133737.png)

选择ESP32主控板的板型 “<span style="color: rgb(255, 0, 0);">ESP32 Dev Moduel</span>” 和串口端口（COM6）（<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">提示：不同的电脑，串口端口是不一样的</span><span style="background: rgb(255, 251, 0);"></span>），(<span style="color: rgb(255, 76, 65);">注意：</span>将ESP32主板通过USB线连接到计算机后才能看到对应的端口。)，如下图所示：

![Img](./media/img-20241023134451.png)

![Img](./media/img-20241023134429.png)

单击 ![Img](./media/img-20241023135146.png)将代码上传到ESP32主控板，如下图所示：

![Img](./media/img-20241023134529.png)

方法②：从电脑打开已经编写好的代码  

将我们提供的代码文件压缩包解压，把解压后的代码文件夹保存到方便使用的位置。

“ 文件 ”-->“ 打开 ”，然后选择保存代码的路径，选中代码文件打开即可。如下图所示：

![Img](./media/img-20241023134712.png)

![Img](./media/img-20241023135106.png)

代码文件打开后，需要手动选择ESP32主控板的板型 “<span style="color: rgb(255, 0, 0);">ESP32 Dev Moduel</span>” 和串口端口（COM6）（<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">提示：不同的电脑，串口端口是不一样的</span><span style="background: rgb(255, 251, 0);"></span>），(<span style="color: rgb(255, 76, 65);">注意：</span>将ESP32主板通过USB线连接到计算机后才能看到对应的端口。)，如下图所示：

![Img](./media/img-20241023134451.png)

![Img](./media/img-20241023134429.png)

单击![Img](./media/img-20241023135157.png)将代码上传到ESP32主控板，如下图所示：

![Img](./media/img-20241023134529.png)


## 项目01 Hello World

**1.项目介绍：**

对于ESP32的初学者，我们将从一些简单的东西开始。在这个项目中，你只需要一个ESP32主板，USB线和电脑就可以完成“Hello World!”项目。它不仅是ESP32主板和电脑的通信测试，也是ESP32的初级项目。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
| :--: | :--: |
| ESP32*1 | USB 线*1 |

**3.项目接线：**

在本项目中，我们通过USB线将ESP32和电脑连接起来。

![](./Arduino/media/46cf3a8a1c79e456ac0f02da5ef38aec.png)

**4.代码说明：**

![Img](./media/img-20241023140243.png)

设置串口波特率，一般是设置为9600。

![Img](./media/img-20241023140328.png)

自动换行输出数据。从串行端口输出数据，跟随一个回车和一个换行符。

![Img](./media/img-20241101093914.png)

从串行端口不换行输出数据。

![Img](./media/img-20241023140625.png)

将程序的执行暂停一段时间，也就是延时。单位是毫秒。 


**5.项目代码：**

你可以打开我们提供的代码，其代码保存在（即路径)：**..\程序代码\Mixly_代码**。（ **<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**）

你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”。

3. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140328.png)”。

4. 从 “![Img](./media/img-20241023140400.png)” 拖出 “![Img](./media/img-20241023140426.png)” 放入 “![Img](./media/img-20241023140328.png)”，将 <span style="color: rgb(255, 76, 65);">hello</span> 修改为 <span style="color: rgb(255, 76, 65);">Hello World</span>。

5. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”。

完整代码：

![Img](./media/img-20241023140731.png)

在上传项目代码到ESP32之前，需要手动选择Arduino ESP32主控板的板型 “<span style="color: rgb(255, 0, 0);">ESP32 Dev Moduel</span>” 和串口端口（COM6）（<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">提示：不同的电脑，串口端口是不一样的</span><span style="background: rgb(255, 251, 0);"></span>）。(<span style="color: rgb(255, 76, 65);">注意：</span>将ESP32主板通过USB线连接到计算机后才能看到对应的端口。) （**<span style="color: rgb(255, 76, 65);">后面上传项目代码的步骤也一样，即：同下</span>。**）

![Img](./media/img-20241023141133.png)

![Img](./media/img-20241023141156.png)

单击 ![Img](./media/img-20241023135146.png) 将项目代码上传到ESP32主板上。(<span style="color: rgb(255, 76, 65);">**下同**</span>)

![Img](./media/img-20241023141718.png)

<span style="color: rgb(255, 76, 65);">**注意**：（**下同**）</span> 如果上传代码不成功，可以再次点击![Img](./media/img-20241023135146.png)后用手按住ESP32主板上的Boot键![](./Arduino/media/a3ce49fbd6f40f09869aa7e1d9f902f8.png)，出现上传进度百分比数后再松开Boot键，如下图所示：

![Img](./media/img-20241023141942.png)

项目代码上传成功！

![Img](./media/img-20241023142033.png)


**6.项目结果：** 

项目代码上传成功后，单击图标![Img](./media/img-20241023142105.png)进入串行监视器，设置波特率为9600，这样串口监视器打印“Hello World!”。

![Img](./media/img-20241023142219.png)

![Img](./media/img-20241023142346.png)

![Img](./media/img-20241023142423.png)


## 项目02 点亮LED

**1.项目介绍：**

在这个项目中，我们将向你展示点亮LED。我们使用ESP32的数字引脚打开LED，使LED被点亮。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/325f351a1cc5c9af86988ddafd03fa19.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|红色LED*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|220Ω电阻*1|跳线*2|USB 线*1|

**3.元件知识：**

**（1）LED**

![](./Arduino/media/32369e035f09fa12898e90cd3f916cbe.png)

LED是一种被称为“发光二极管”的半导体，是一种由半导体材料(硅、硒、锗等)制成的电子器件。它有正极和负极。短腿为负极，接GND，长腿为正极，接3.3V或5V。

![](./Arduino/media/cbb16ef4d8cb62a4001d1a05ae3ac615.png)

**（2）五色环电阻**

电阻是电路中限制或调节电流流动的电子元件。左边是电阻器的外观，右边是电阻在电路中表示的符号。电阻(R)的单位为欧姆(Ω)，1 mΩ= 1000 kΩ，1kΩ= 1000Ω。
   
我们可以使用电阻来保护敏感组件，如LED。电阻的强度（以Ω为单位）用小色环标记在电阻器的主体上。每种颜色代表一个数字，你可以用电阻对照卡查找。

![](./Arduino/media/e60472f717ced1cc0bd94f4972ef0cd0.png)

在这个套件中，我们提供了3个具有不同电阻值的五色环电阻。这里以3个五色环电阻为例：
220Ω电阻×10

![](./Arduino/media/951ce7d7778b34bf8fbdb3de1b8c3116.png)

10KΩ电阻×10

![](./Arduino/media/2d3f0996515352c92c07d17e074e7308.png)

1KΩ电阻×10

![](./Arduino/media/931d1535563f6d817300f97c0946a01c.png)

在相同的电压下，会有更小的电流和更大的电阻。电流、电压、电阻之间的联系可以用公式表示：I=U/R。在下图中，目前通过R1的电流: I = U / R = 3 V / 10 KΩ= 0.0003A= 0.3mA。

![](./Arduino/media/997accddd11490d13b769b9f3477daa7.png)

不要把电阻值很低的电阻直接连接在电源两极，这样会使电流过高而损坏电子元件。电阻是没有正负极之分。

**（3）面包板**

面包板是实验室中用于搭接电路的重要工具。面包板上有许多孔，可以插入集成电路和电阻等电路元件。熟练掌握面包板的使用方法是提高实验效率，减少实验故障出现几率的重要基础之一。下面就面包板的结构和使用方法做简单介绍。一个典型的面包板如下所示：

![](./Arduino/media/d4cb46e6b01d820bb150f0e8a122417e.png)

 面包板的外观和内部结构如上图所示，常见的最小单元面包板分上、中、下三部分，上面和下面部分一般是由一行或两行的插孔构成的窄条，中间部分是由中间一条隔离凹槽和上下各5 行的插孔构成的条。

![](./Arduino/media/2e9ef45f88652609af40b031ed0f0084.png)

在面包板的两个窄条分别有两行插孔，两行之间是不连通的，一般是作为电源引入的通路。上方第一行标有“+”的一行有10组插孔（内部都是连通），均为正极；上方第二行标有“-”的一行有10组插孔，（内部都是连通），均为接地。面包板下方的第一行与第二行结构同上。如需用到整个面包板，通常将“+”与“+”用导线连接起来，“-”与“-”用导线连接起来。

中间部分宽条是由中间一条隔离凹槽和上下各5 行的插孔构成。在同一列中的5 个插孔是互相连通的，列和列之间以及凹槽上下部分则是不连通的。外观及结构如下图：

![](./Arduino/media/8690e125a8f918f5e2b7950526e98ebb.png)

中间部分宽条的连接孔分为上下两部分，是面包板的主工作区，用来插接原件和跳线。在同一列中的5个插孔（即a-b-c-d-e，f-g-h-i-j）是互相连通的；列和列之间以及凹槽上下部分是不连通的。在做实验的时候，通常是使用两窄一宽组成的小单元，在宽条部分搭接电路的主体部分，上面的窄条取一行做电源，下面的窄条取一行做接地。中间宽条用于连接电路，由于凹槽上下是不连通的，所以集成块一般跨插在凹槽上。

**(4)电源**

ESP32需要3.3V-5V电源，在本项目中，我们通过用USB线将ESP32和电脑连起来。

![](./Arduino/media/46cf3a8a1c79e456ac0f02da5ef38aec.png)

**4.项目接线图：**

首先，切断ESP32的所有电源。然后根据接线图搭建电路。电路搭建好并验证无误后，用USB线将ESP32连接到电脑上。

<span style="color: rgb(255, 76, 65);">注意：</span>避免任何可能的短路(特别是连接3.3V和GND)!

<span style="color: rgb(255, 76, 65);">警告：短路可能导致电路中产生大电流，造成元件过热，并对硬件造成永久性损坏。</span>

![](./Arduino/media/6d79aa47daab6bc5dc46b1e62215d9c8.png)

<span style="color: rgb(255, 76, 65);">注意: </span>

怎样连接LED 

![](./Arduino/media/cbb16ef4d8cb62a4001d1a05ae3ac615.png)

怎样识别五色环220Ω电阻

![](./Arduino/media/951ce7d7778b34bf8fbdb3de1b8c3116.png)

**5.代码说明：**

![Img](./media/img-20241029163343.png)

向指定管脚设置“高”或“低”，选择“高”代表给该管脚设置高电平，有电压，有电流，则LED点亮；选择“低”代表给管脚设置低电平，没电压，没有电流，则LED不亮。

**6.项目代码：**

你可以打开我们提供的代码，其代码保存在（即路径)：**..\程序代码\Mixly_代码** 。（**<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**）

你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029163433.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 15 ，设为 “低” 。

3. 又从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029163445.png) ” ，管脚为 15 ，设为 “高” 。

完整代码：

![Img](./media/img-20241029163546.png)


**7.项目现象：**

项目代码上传成功后，利用USB线供电，LED被点亮。

![](./Arduino/media/96672306fbbac2d8b33a55315d0d8fc5.png)





## 项目03 LED闪烁

**1.项目介绍：**

在这个项目中，我们将向你展示LED闪烁效果。我们使用ESP32的数字引脚打开LED，让它闪烁。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/325f351a1cc5c9af86988ddafd03fa19.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|红色LED*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|220Ω电阻*1|跳线*2|USB 线*1|

**3.项目接线图：**

首先，切断ESP32的所有电源。然后根据电路图和接线图搭建电路。电路搭建好并验证无误后，用USB线将ESP32连接到电脑上。

<span style="color: rgb(255, 76, 65);">注意：</span>避免任何可能的短路(特别是连接3.3V和GND)!

<span style="color: rgb(255, 76, 65);">警告：短路可能导致电路中产生大电流，造成元件过热，并对硬件造成永久性损坏。 </span>

![](./Arduino/media/6d79aa47daab6bc5dc46b1e62215d9c8.png)


<span style="color: rgb(255, 76, 65);">注意: </span>

怎样连接LED 

![](./Arduino/media/cbb16ef4d8cb62a4001d1a05ae3ac615.png)

怎样识别五色环220Ω电阻

![](./Arduino/media/951ce7d7778b34bf8fbdb3de1b8c3116.png)

**4.项目代码：**

你可以打开我们提供的代码：其代码保存在（即路径)：**..\程序代码\Mixly_代码** 。（**<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**）

你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029163433.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 15 ，设为 “低” 。

3. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029163433.png) ” ，管脚为 15 ，设为 “高” 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为500毫秒。

5. 复制代码块 “![Img](./media/img-20241029163924.png) ” 1 次，将 “高” 改为 “低”。

完整代码：

![Img](./media/img-20241029163959.png)

**5.项目现象：**

项目代码上传成功后，利用USB线上电，可以看到的现象是：可以看到电路中的LED会反复闪烁。

![](./Arduino/media/bbd161f32b47a175d78773391bd7b0c1.png)











## 项目04 呼吸灯

**1.项目介绍：**

在之前的研究中，我们知道LED有亮/灭状态，那么如何进入中间状态呢?如何输出一个中间状态让LED“半亮”?这就是我们将要学习的。呼吸灯，即LED由灭到亮，再由亮到灭，就像“呼吸”一样。那么，如何控制LED的亮度呢?我们将使用ESP32的PWM来实现这个目标。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/325f351a1cc5c9af86988ddafd03fa19.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|红色LED*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|220Ω电阻*1|跳线*2|USB 线*1|

**3.元件知识：**

![](./Arduino/media/e739a6e4a95fa8bbbefb26ef955dc465.png)

**模拟信号 & 数字信号** 

模拟信号在时间和数值上都是连续的信号。相反，数字信号或离散时间信号是由一系列数字组成的时间序列。生活中的大多数信号都是模拟信号，一个熟悉的模拟信号的例子是：全天的温度是连续不断变化的，而不是突然从0到10的瞬间变化。然而，数字信号的值可以瞬间改变。这个变化用数字表示为1和0(二进制代码的基础)。如下图所示，我们可以更容易地看出它们的差异。

![](./Arduino/media/550c1d587189ce5ac3678f44b08ac888.png)

在实际应用中，我们经常使用二进制作为数字信号，即一系列的0和1。由于二进制信号只有两个值(0或1)，因此具有很大的稳定性和可靠性。最后，可以将模拟信号和数字信号相互转换。

**PWM：**

脉宽调制(PWM)是一种利用数字信号控制模拟电路的有效方法。普通处理器不能直接输出模拟信号。PWM技术使这种转换(将数字信号转换为模拟信号)非常方便。PWM技术利用数字引脚发送一定频率的方波，即高电平和低电平的输出，交替持续一段时间。每一组高电平和低电平的总时间一般是固定的，称为周期(注:周期的倒数是频率)。高电平输出的时间通常称为脉宽，占空比是脉宽(PW)与波形总周期(T)之比的百分比。高电平输出持续时间越长，占空比越长，模拟信号中相应的电压也就越高。下图显示了对应于脉冲宽度0%-100%的模拟信号电压在0V-3.3V(高电平为3.3V)之间的变化情况.

![](./Arduino/media/0c29da4ca7a2fee2f5a0078eacc9e88a.png)

PWM占空比越长，输出功率越高。既然我们了解了这种关系，我们就可以用PWM来控制LED的亮度或直流电机的速度等等。从上面可以看出，PWM并不是真实的模拟信号，电压的有效值等于相应的模拟信号。因此，我们可以控制LED和其他输出模块的输出功率，以达到不同的效果。

**ESP32 与 PWM**

在ESP32上，LEDC(PWM)控制器有16个独立通道，每个通道可以独立控制频率，占空比，甚至精度。与传统的PWM引脚不同，ESP32的PWM输出引脚是可配置的，每个通道有一个或多个PWM输出引脚。最大频率与比特精度的关系如下公式所示：

![](./Arduino/media/c6afada712f786a0827ced2172fed124.png)

其中比特的最大值为31。例如: 生成PWM的8位精度(2ˆ8 = 256。取值范围为0 ~ 255)，最大频率为80,000,000/255 = 312,500Hz。)

**4.项目接线图：**

![](./Arduino/media/6d79aa47daab6bc5dc46b1e62215d9c8.png)

**5.代码说明：**

![Img](./media/img-20241029165007.png)

向指定管脚设置通道，赋值可以为0 ~ 255。

![Img](./media/img-20241029164725.png)

将数字管脚15的通道设置为CH0(LT0)，赋值为0 ，是LED熄灭。

![Img](./media/img-20241029165054.png)

将管脚 15 的通道设置为CH0(LT0)，赋值为i。

![Img](./media/img-20241029165146.png)

设置一个变量 i ，i从 0 逐渐增加到 255，每一次都加 5，总共加了 51 次， 每次以10毫秒的频率增加 5，LED逐渐变亮。

![Img](./media/img-20241029165211.png)

设置一个变量i，i从 255 逐渐减少到 0，每一次都减5，总共减了51次， 每次以 10 毫秒的频率减 5，LED逐渐变暗。

**6.项目代码：**

<span style="color: rgb(255, 76, 65);">本项目设计使GPIO15 输出PWM，脉宽由0%逐渐增加到100%，再由100%逐渐减小到0%。</span>

你可以打开我们提供的代码，其代码保存在（即路径)：**..\程序代码\Mixly_代码** 。（**<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**）


你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029165252.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 15 ，通道设置为CH0(LT0)，赋值为 0。

3. 从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241029165415.png) ” ，从 1 到 10 步长为 1 改成从 0 到 255 步长为 5。

4. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029165252.png) ” 放入 “ ![Img](./media/img-20241029165529.png) ”，管脚为 15 ，通道设置为CH0(LT0)；又从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241024133651.png) ” 放入赋值为 0 处。

5. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)” 放入 “ ![Img](./media/img-20241029165529.png) ”，设置延时为10毫秒。

6. 复代码块 “ ![Img](./media/img-20241029165711.png)” 1 次，从 0 到 255 步长为 5 改成从 255 到 0 步长为 -5。


完整代码：

![Img](./media/img-20241029164439.png)


**7.项目现象：**

项目代码上传成功后，利用USB线上电，可以看到的现象是：电路中的LED从暗逐渐变亮，再从亮逐渐变暗，就像呼吸一样。

![](./Arduino/media/7a0d2717b48056cbef36f880212d8e07.png)




## 项目05 交通灯

**1.项目介绍：**

交通灯在我们的日常生活中很普遍。根据一定的时间规律，交通灯是由红、黄、绿三种颜色组成的。每个人都应该遵守交通规则，这可以避免许多交通事故。在这个项目中，我们将使用ESP32和一些led(红，黄，绿)来模拟交通灯。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/325f351a1cc5c9af86988ddafd03fa19.png)|![](./Arduino/media/36f39ba5899a86990d02500371bc0e77.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|红色LED*1|黄色 LED*1|
|![](./Arduino/media/f361df3b38005087cb22efc34689d554.png)|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|绿色LED*1|220Ω电阻*3|跳线若干|USB 线*1|

**3.项目接线图：**

![](./Arduino/media/6122c8ef01c7a01dc5491df1c73a00b1.png)

**4.项目代码：**

你可以打开我们提供的代码，其代码保存在（即路径)：**..\程序代码\Mixly_代码** 。（**<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**）

你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 分别拖出 “ ![Img](./media/img-20241029171029.png) ” 、 “ ![Img](./media/img-20241029171054.png) ” 、 “ ![Img](./media/img-20241029171118.png) ” 放入 “![Img](./media/img-20241023140106.png)”，红色LED管脚为 0 、黄色LED管脚为 2 、绿色LED管脚为 15 ，全部设为 “低”。

![Img](./media/img-20241029171409.png)

3. 复制代码块 “ ![Img](./media/img-20241029171205.png) ” 1 次，将红色LED设为 “高”；又从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为5000毫秒；再复制复制代码块 “ ![Img](./media/img-20241029171244.png) ” 1次，延时为500毫秒。

![Img](./media/img-20241029171344.png)

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241029165415.png) ” ，从 1 到 10 步长为 1 改成从 1 到 3 步长为 1。

5. 复制代码块 “ ![Img](./media/img-20241029171728.png) ” 1 次 放入 “ ![Img](./media/img-20241029171832.png) ”，将黄色LED设为 “低” 改成设为 “高”，再复制代码块 “ ![Img](./media/img-20241029171739.png) ” 1 次放入 “ ![Img](./media/img-20241029171839.png) ” ，

![Img](./media/img-20241029171941.png)

6. 复制代码块 “ ![Img](./media/img-20241029172025.png) ” 1次，将红色LED设为 “高” 改成 “低” ，再把绿色LED设为 “低” 改成设为 “高”。

![Img](./media/img-20241029172101.png)

7. 复制代码块 “ ![Img](./media/img-20241029171739.png) ” 1次。


完整代码：

![Img](./media/img-20241029170807.png)


**5.项目现象：**

项目代码上传成功后，利用USB线上电，你会看到的现象是：1.首先，红灯会亮5秒，然后熄灭；2.其次，黄灯会闪烁3次，然后熄灭；3.然后，绿灯会亮5秒，然后熄灭；4.继续运行上述1-3个步骤。

![](./Arduino/media/88468668fc5f1d198863c79778862194.png)









## 项目06 RGB LED

![](./Arduino/media/bd43dadde69fa133646046983ca30f0f.png)

**1.项目介绍：**

RGB led由三种颜色(红、绿、蓝)组成，通过混合这三种基本颜色可以发出不同的颜色。在这个项目中，我们将向你介绍RGB LED，并向你展示如何使用ESP32控制RGB LED发出不同的颜色光。即使RGB LED是非常基本的，但这也是一个介绍自己或他人电子和编码基础的伟大方式。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/6de88c5b9c38d8ab879ae91eb51431b7.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|RGB LED*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|220Ω电阻*3|跳线若干|USB 线*1|

**3.元件知识：**

显示器大多遵循RGB颜色标准，电脑屏幕上的所有颜色都是由红、绿、蓝三种颜色以不同比例混合而成。  

![](./Arduino/media/ae51546482ff149a5cd40ead3d110bc8.png)

这个RGB LED有4个引脚，每个颜色(红，绿，蓝)和一个共同的阴极。为了改变RGB led的亮度，我们可以使用ESP的PWM引脚。PWM引脚会给RGB led不同占空比的信号以获得不同的颜色。

如果我们使用3个10位PWM来控制RGBLED，理论上我们可以通过不同的组合创建2^10 ×2^10 ×2^10= 1,073,741,824(10亿)种颜色。

**4.项目接线图：**

![](./Arduino/media/a89020210f9ff33ca99ddf347cc86a21.png)

**5.代码说明：**

![Img](./media/img-20241101084925.png)

设置共阴RGB亮不同颜色光，R、G、B可以在 0 ~ 255 之间设置任何数字。

**6.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241101090120.png) ” 放入 “![Img](./media/img-20241023140106.png)”，R 管脚 为 0 、G 管脚 为 2 、B 管脚 为 15 ，R 、G、B 的值都赋值为 0 。

![Img](./media/img-20241101091350.png)

3. 从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241029165415.png) ” ，从 1 到 10 步长为 1 改成从 0 到 255 步长为 1。

4. 复制代码块 “ ![Img](./media/img-20241113162455.png) ” 1 次放入 “ ![Img](./media/img-20241029174446.png) ” ，又从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241024133651.png) ” 放入 R（0 ~ 255）后面 0 处；再从 “ ![Img](./media/img-20241024143857.png) ” 拖出 “ ![Img](./media/img-20241029174654.png) 放入 G（0 ~ 255）后面 0 处，将 “ + ” 改成 “ - ” ，把“ - ”前面的 1 改成 128，“ - ”后面的 1 替换成变量 i ；再复制代码块 “ ![Img](./media/img-20241029174845.png) ” 放入 G（0~255）后面 0 处，将 128 改成 255 ；再延时 10 毫秒。

![Img](./media/img-20241029175036.png)

6. 复制代码块 “ ![Img](./media/img-20241029175119.png) ” 1 次，将 从 0 到 255 步长为 1 改成 从 255 到 0 步长为 -1 。

![Img](./media/img-20241101092739.png)

完整代码：

![Img](./media/img-20241029175442.png)

**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电后，你会看到的现象是：RGB LED开始显示随机颜色。

![](./Arduino/media/b926527c01e66d984f86facdb97e10fc.png)


























## 项目07 流水灯

**1.项目介绍：**

在日常生活中，我们可以看到许多由不同颜色的led组成的广告牌。他们不断地改变灯光(像流水一样)来吸引顾客的注意。在这个项目中，我们将使用ESP32控制10个leds实现流水的效果。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/325f351a1cc5c9af86988ddafd03fa19.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|红色LED*10|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|220Ω电阻*10|跳线若干|USB 线*1|

**3.项目接线图:**

![Img](./media/img-20241030132632.png)

**4.项目代码：**

本项目是设计制作一个流水灯。这是这些行动：首先打开LED #1，然后关闭它。然后打开LED #2，然后关闭…并对所有10个LED重复同样的操作，直到最后一个LED关闭。这一过程反复进行，以实现流水的“运动”。

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028131724.png)” 放入 “![Img](./media/img-20241023140106.png)” 中；再从 “![Img](./media/img-20241024143857.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “![Img](./media/img-20241028131724.png)”中，将 “item” 改成 “ i ” 。

![Img](./media/img-20241030133527.png)

3. 从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241030133339.png) ” 放入 “![Img](./media/img-20241023140106.png)”，从 1 到 10 步长为 1 改成从 12 到 22 步长为 1。

![Img](./media/img-20241030133609.png)

4. 先从 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029171029.png) ”  放入 “ ![Img](./media/img-20241030133746.png)” ；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241024133651.png) ” 放入 “管脚 <span style="color: rgb(255, 76, 65);">0</span> ” 处 ，“ 高 ” 改成 “ 低 ”。

![Img](./media/img-20241030160306.png)


5. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241030133339.png) ” ，从 1 到 10 步长为 1 改成从 12 到 22 步长为 1 ；又从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029171029.png) ” 放入 “ ![Img](./media/img-20241030133746.png)”；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241024133651.png) ” 放入 “管脚 <span style="color: rgb(255, 76, 65);">0</span> ” 处 ；添加延时200毫秒。

![Img](./media/img-20241030134834.png)

6. 复制代码块 “ ![Img](./media/img-20241030134918.png) ” 1次，从 12 到 22 步长为 1 改成从 22 到 12 步长为 -1 ，“ 高 ” 改成 “ 低 ”。

![Img](./media/img-20241030135133.png)


完整代码：

![Img](./media/img-20241030160212.png)


**5.项目现象：**

代码上传成功后，利用USB线上电后，你会看到的现象是：10个LED将从右到左点亮，然后从左到右返回。

![Img](./media/img-20241115082441.png)

![Img](./media/img-20241115082446.png)























## 项目08 一位数码管

**1.项目介绍：** 

七段数码管是一种显示十进制数字的电子显示设备，广泛应用于数字时钟、电子仪表、基本计算器和其他显示数字信息的电子设备。甚至我们在电影中看到的炸弹也有七段数码管。也许七段数码管看起来不够现代，但它们是更复杂的点阵显示器的替代品，在有限的光线条件下和强烈的阳光下都很容易使用。在这个项目中，我们将使用ESP32控制一位数码管显示数字。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/205aad52163781b8f1857212f1011848.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|一位数码管*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|220Ω电阻*8|跳线若干|USB 线*1|

**3.元件知识：** 

![](./Arduino/media/24cd9e937ce10d6bd7bd04581d758894.png)

**一位数码管显示原理：** 数码管显示是一种半导体发光器件。它的基本单元是一个发光二极管(LED)。数码管显示根据段数可分为7段数码管和8段数码管。8段数码管比7段多一个LED单元(用于小数点显示)。七段LED显示屏的每段是一个单独的LED。根据LED单元接线方式，数码管可分为共阳极数码管和共阴极什数码管。

在共阴极7段数码管中，分段LED的所有阴极(或负极)都连接在一起，你应该把共阴极连接到GND，要点亮一个分段LED，你可以将其关联的引脚设置为HIGH。

在共阳极7段数码管中，所有段的LED阳极(正极)都连接在一起，你应该把共阳极连接到+5V。要点亮一个分段LED，你可以将其关联的引脚设置为LOW。

![](./Arduino/media/19ff4c77c2703c262a9cd5295724ae02.png)

数码管的每个部分由一个LED组成。所以当你使用它的时候，你也需要使用一个限流电阻。否则，LED会被烧坏。在这个实验中，我们使用了一个普通的<span style="color: rgb(255, 76, 65);">共阴极一位数码管</span>。正如我们上面提到的，你应该将公共阴极连接到GND。要点亮一个分段LED，你可以将其关联的引脚设置为HIGH。

**4.项目接线图：**

<span style="color: rgb(255, 76, 65);">注意：</span>插入面包板的七段数码管方向与接线图一致，右下角多一个点。

![](./Arduino/media/b1774fdf03e96a8b6a16d03db21a93a0.png)

![](./Arduino/media/da76f2ea8684ac4bb13d8b55d272977a.png)

**5.代码说明：**

![Img](./media/img-20241101172215.png)

初始化一位数码管的管脚，二维数组等等。

![Img](./media/img-20241028162152.png)

这是显示数字的一位数码管指令方块，可以显示 1 位数字：0 ~ 9。

**6.项目代码：**

数字显示分7段，小数点显示分1段。当显示某些数字时，相应的段将被点亮。例如，当显示数字1时，b和c段将被打开。

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241028162701.png)” 拖出 “ ![Img](./media/img-20241101172215.png) ” 放入 “![Img](./media/img-20241023140106.png)”。

3. 从 “ ![Img](./media/img-20241028162701.png) ” 拖出 “ ![Img](./media/img-20241028162733.png) ”，数字 0 改成 9 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为1000毫秒。

5. 复制代码块 “![Img](./media/img-20241028162944.png)” 9次，将数字 9 分别改成 8、7、6、5、4、3、2、1、0。

完整代码：

![Img](./media/img-20241028163224.png)


**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电后，你会看到的现象是：一位数码管将显示从9到0的数字。

![](./Arduino/media/06886089efa6a52fef3a5e85cd3327cc.png)


















## 项目09 四位数码管

**1.项目介绍：**

四位数码管是一种非常实用的显示器件，电子时钟的显示，球场上的记分员，公园里的人数都是需要的。由于价格低廉，使用方便，越来越多的项目将使用4位数码管。在这个项目中，我们使用ESP32控制四位数码管来显示数字。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/9fdfea69b62531a92309052760130694.png) |
| :--: | :--: | :--: |
|ESP32*1|面包板*1|四位数码管*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|220Ω电阻*8|跳线若干|USB 线*1|

**3.元件知识：**

![](./Arduino/media/57fbc9480875664d1ad27536ff79728d.png)

**四位数码管：** 四位数码管有共阳极和共阴极两种四位数码管，显示原理是和一位数码管是类似的，都是8个GPIO口控制数码管的显示段，就是8个led灯，不过，这里是4位的，所以就还需要4个GPIO口来控制位选择端，就是选择哪个单个数码管亮，位的切换很快，肉眼区分不出来，这样看起来是多个数码管同时显示。

<span style="color: rgb(255, 76, 65);">我们的四位数码管是共阴极的</span>。

下图为4位数码管的引脚图，G1、G2、G3、G4就是控制位的引脚。

![](./Arduino/media/da1ad5bb24e7bcd8b2671641ed38f3c4.png)

下图为4位数码管内部布线原理图

![](./Arduino/media/2b44ecde85d4f9fcaa73cfcd2e6914d9.png)

![](./Arduino/media/84fbe7aa78a614af5e5e8ada6c7a509d.png)

**4.项目接线图：**

![](./Arduino/media/b34ecf777f13629448cd300a8c33e39c.png)

**5.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241105110746.png)” 拖出 “![Img](./media/img-20241105110810.png)” ，将数字 0 改成 3456 。

完整代码：

![Img](./media/img-20241105110716.png)

**6.项目现象：**

代码上传成功后，利用USB线上电后，你会看到的现象是：四位数码管显示四位数字 3456 。

![Img](./media/img-20241105111932.jpg)





## 项目10 8×8点阵屏

**1.项目介绍：**

点阵屏是一种电子数字显示设备，可以显示机器、钟表、公共交通离场指示器和许多其他设备上的信息。在这个项目中，我们将使用ESP32控制8x8 LED点阵来显示图案。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/e5d2b82a75e728b09b97cc15056b0287.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|8×8点阵屏*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|220Ω电阻*8|跳线若干|USB 线*1|

**3.元件知识：**

**8×8点阵：** 是由64个led灯组成，有行共阳极和行共阴极两种，我们的模块是行共阳极的，也就是每一行有一条线将LED的正极连到一起，列就是将LED灯的负极连接到一起，看下图：

![](./Arduino/media/c41aaa44085da33d18ef06727b575091.png)

每个LED被放置在一行和一列的交叉点上。当某一行的电平为1，某列的电平为0时，对应的LED会亮起。如果你想点亮第一个点上的LED，你应该将引脚9设置为高电平，引脚13设置为低电平。如果你想点亮第一排的led，你应该把引脚9设置为高电平，把引脚13、3、4、10、6、11、15和16设置为低电平。如果您想点亮第一列的led，将引脚13设置为低电平，将引脚9、14、8、12、1、7、2和5设置为高电平。

**8×8点阵屏的外部视图如下所示：**

![](./Arduino/media/fec2ed85eb857e75ef5f3692fa6a4325.png)

![](./Arduino/media/1c0b9e68ffa8d605e0b4ee1b36e07d57.png)

![](./Arduino/media/086139dd80ed8bc7b7f291357ec94f4f.png)


**4.项目接线图：**

![](./Arduino/media/38b8f66bb31399c80d56e4bed07b3803.png)

**5.代码说明：**

![Img](./media/img-20241101162742.png)

初始化8*8点阵的管脚和二维数组等等。

![Img](./media/img-20241101162926.png)

8*8点阵可以显示数字 0 ~ 9 。

**6.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从“ ![Img](./media/img-20241028162701.png) ” 拖出 “ ![Img](./media/img-20241101163818.png) ”放入 “![Img](./media/img-20241023140106.png)” 中

![Img](./media/img-20241101164158.png)

3. 先从 “ ![Img](./media/img-20241028162701.png) ” 拖出 “ ![Img](./media/img-20241101163931.png) ”；再从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)” ，延时为 2000 毫秒。  

![Img](./media/img-20241101164224.png)

4. 复制代码块 “ ![Img](./media/img-20241101164258.png) ” 9 次，将数字 0 依次改成 1、2、3、4、5、6、7、8、9 。

完整代码：

![Img](./media/img-20241101163108.png)

**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：8*8点阵屏依次显示数字0~9，循环进行。

![](./Arduino/media/d979f0b9a2cd828104fa2155632fe690.png)






















## 项目11 74HC595N控制8个LED

**1.项目介绍：**

在之前的项目中，我们已经学过了怎样点亮一个LED。

ESP32上只有32个IO端口，我们如何点亮大量的led呢? 有时可能会耗尽ESP32上的所有引脚，这时候就需要用移位寄存器扩展它。你可以使用74HC595N芯片一次控制8个输出，而只占用你的微控制器上的几个引脚。你还可以将多个寄存器连接在一起，以进一步扩展输出，在这个项目中，我们将使用ESP32，74HC595芯片和LED制作一个流水灯来了解74HC595芯片的功能。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/44e4bc7bbc88eafd59a57fc4876f6725.png)|![](./Arduino/media/0bec60f258b235ba8a8a332fd1b6e5fe.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|74HC595N芯片*1|红色LED*8|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)| |
|220Ω电阻*8|跳线若干|USB 线*1| |

**3.元件知识：**

![](./Arduino/media/46bf6b6fb5968bea5b7fd226a6f95567.png)

**74HC595N芯片：** 简单来说就是具有8 位移位寄存器和一个存储器，以及三态输出功能。移位寄存器和存储器同步于不同的时钟，数据在移位寄存器时钟SCK的上升沿输入，在存储寄存器时钟RCK的上升沿进入的存储寄存器中去。如果两个时钟连在一起，则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入端（SI）和一个用于级联的串行输出端（SQH）,8位移位寄存器可以异步复位（低电平复位），存储寄存器有一个8位三态并行的总线输出，当输出使能（OE）被使能（低电平有效）将存储寄存器中输出至74HC595N的引脚（总线）。

![Img](./media/img-20241115082355.png)

**引脚说明：**

| 引脚： | 引脚说明： |
| :--: | :--: |
| 13引脚OE|	是一个输出使能引脚，用于确保锁存器的数据是否输入到Q0-Q7引脚。在低电平时，不输出高电平。在本实验中，我们直接连接GND，保持低电平输出数据。|
|14引脚SI/DS|这是74HC595接收数据的引脚，即串行数据输入端，一次只能输入一位，那么连续输入8次，就可以组成一个字节了。|
|10引脚SCLR/MR|一个初始化存储寄存器管脚的管脚。在低电平时初始化内部存储寄存器。在这个实验中，我们连接VCC以保持高水平。|
|11引脚SCK/SH_CP|移位寄存器的时钟引脚，上升沿时，移位寄存器中的数据整体后移，并接收新的数据输入。|
|12引脚RCK/ST_CP|存储寄存器的时钟输入引脚。上升沿时，数据从移位寄存器转存到存储寄存器中。这时数据就从Q0~Q7端口并行输出。|
|9引脚SQH|引脚是一个串行输出引脚，专门用于芯片级联，接下一个74HC595的SI端。|
|Q0--Q7(15引脚，1-7引脚)|八位并行输出端，可以直接控制数码管的8个段。|

**4.项目接线图：**

<span style="color: rgb(255, 76, 65);">注意：</span>需要注意74HC595N芯片插入的方向。

![](./Arduino/media/9b0649bf40ed46557baabcf617c69804.png)

![](./Arduino/media/cc4e68fb791ca0f40d0e6554d43b1ab2.png)

**5.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 先从 “ ![Img](./media/img-20241024133608.png) ” 拖出 “![Img](./media/img-20241028131724.png)” 3 次 放入 “![Img](./media/img-20241023140106.png)” 中；再从 “![Img](./media/img-20241024143857.png)” 拖出 “![Img](./media/img-20241028132058.png)” 3 次 放入 “![Img](./media/img-20241028131724.png)”中，将 item 分别改成 dataPin、latchPin、clockPin，对应的赋值后面数字 0 改成 14、12、13 。

![Img](./media/img-20241104095817.png)

3. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029165415.png)” ，从 1 到 10 步长为 1 改成从 0 到 255 步长为 1。

4. 从 “![Img](./media/img-20241104100000.png)” 分别拖出 “![Img](./media/img-20241104100044.png)” 、“![Img](./media/img-20241104100302.png)” 、“![Img](./media/img-20241104100044.png) ” 放入 “ ![Img](./media/img-20241104100123.png) ” 中，再从 “![Img](./media/img-20241024133608.png)” 分别拖出 “![Img](./media/img-20241104100457.png)”、“![Img](./media/img-20241104100519.png)”、“![Img](./media/img-20241104100546.png)”、“![Img](./media/img-20241104100726.png)”，“![Img](./media/img-20241104100457.png)” 依次对应的放入；将 第 1 个管脚 latchPin 后面的 “ 高 ” 改成 “ 低 ”，“ 高位先入 ” 改成 “ 低位先入 ” 。

![Img](./media/img-20241104101051.png)

5. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)” 放入 “![Img](./media/img-20241104100123.png)” 中，设置延时为100毫秒。


完整代码：

![Img](./media/img-20241104094842.png)

**6.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，可以看到的现象是：8个LED开始以流水模式闪烁。

![](./Arduino/media/de7ef1d58423282ec05b12fdc0af0292.png)










## 项目12 有源蜂鸣器

**1.项目介绍：**

有源蜂鸣器是一个发声组件。它被广泛用作电脑、打印机、报警器、电子玩具、电话、计时器等的发声元件。它有一个内在的振动源，只需连接5V电源，即可持续发出嗡嗡声。在这个项目中，我们将使用ESP32控制有源蜂鸣器发出“滴滴”声。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/a802ce7dc086858873e587c19b45578d.png)|![](./Arduino/media/6c3a06627faa0d87dd69cbd361929240.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|有源蜂鸣器*1|NPN型晶体管(S8050)*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)| |
|1KΩ电阻*1|跳线若干|USB线*1| |

**3.元件知识：**

![](./Arduino/media/7ac473b007da81c891ca12b4c82fac4a.png)

**有源蜂鸣器：** 它内部有一个简单的振荡器电路，可以将恒定的直流电转换成特定频率的脉冲信号。一旦有源蜂鸣器收到一个高电平，它将产生声音。而无源蜂鸣器是一种内部没有振动源的集成电子蜂鸣器，它必须由2K-5K方波驱动，而不是直流信号。这两个蜂鸣器的外观非常相似，但是一个带有绿色电路板的蜂鸣器是无源蜂鸣器，而另一个带有黑色胶带的是有源蜂鸣器。无源蜂鸣器不能区分正极性而有源蜂鸣器是可以，如下所示：

![](./Arduino/media/a33496a4d5eb90ea4d980459d7654b0f.png)

![](./Arduino/media/6c3a06627faa0d87dd69cbd361929240.png)

**晶体管:** 由于蜂鸣器需要很大的电流，ESP32输出能力的GPIO不能满足要求，这里需要一个NPN型晶体管来放大电流。晶体管，全称:半导体晶体管，是一种控制电流的半导体器件。晶体管可以用来放大微弱信号，也可以用作开关。它有三个电极(pin)：基极(b)，集电极(c)和发射极(e)。当电流通过“be”之间时，“ce”将允许几倍的电流通过(晶体管放大)，此时，晶体管在放大区工作。当“be”之间的电流超过某个值时，“ce”将不再允许电流增加，此时晶体管工作在饱和区。晶体管有两种类型如下所示：PNP和NPN

![](./Arduino/media/96deb6c440780b1bc8acde29ef214727.png)

<span style="color: rgb(255, 76, 65);">在我们的套件中，PNP晶体管标记为8550,NPN晶体管标记为8050。</span>

基于晶体管的特性，它常被用作数字电路中的开关。由于单片机输出电流的能力很弱，我们将使用晶体管来放大电流和驱动大电流的元件。在使用NPN晶体管驱动蜂鸣器时，通常采用以下方法：如果GPIO输出高电平，电流将流过R1，晶体管将传导，蜂鸣器将发出声音。如果GPIO输出低电平，没有电流流过R1，晶体管就不会传导，蜂鸣器也不会响。在使用PNP晶体管驱动蜂鸣器时，通常采用以下方法：如果GPIO输出低电平，电流将流过R1，晶体管将传导，蜂鸣器将发出声音。如果GPIO输出高电平，没有电流流过R1，晶体管就不会传导，蜂鸣器也不会响。

![](./Arduino/media/05d42ad7919cc237e007cd2457aacd7c.png)

**4.项目接线图：**

![](./Arduino/media/45b50e33587ccd6c5c2b5af7c7ba7658.png)

<span style="color: rgb(255, 76, 65);">注意：该电路中蜂鸣器的电源为5V。在3.3V的电源下，蜂鸣器可以工作，但会降低响度。</span>

**5.代码说明：**

![Img](./media/img-20241030105856.png)

向指定管脚设置“高”或“低”，选择“高”代表给该管脚设置高电平，有电压，有电流，则有源蜂鸣器鸣叫；选择“低”代表给管脚设置低电平，没电压，没有电流，则有源蜂鸣器不响。

**6.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：


1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241030105806.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 15 ，设为 “低” 。

3. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241030105806.png) ” ，管脚为 15 ，设为 “高” 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为500毫秒。

5. 复制代码块 “ ![Img](./media/img-20241030110106.png) ” 1 次，将 “高” 改为 “低”。

完整代码：


![Img](./media/img-20241030110140.png)


**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，可以看到的现象是：有源蜂鸣器发出“滴滴”声。

![](./Arduino/media/4d1cee558b3cb395234d05214995c631.png)















## 项目13 无源蜂鸣器

**1.项目介绍：**

在之前的项目中，我们研究了有源蜂鸣器，它只能发出一种声音，可能会让你觉得很单调。这个项目将学习另一种蜂鸣器，无源蜂鸣器。与有源蜂鸣器不同，无源蜂鸣器可以发出不同频率的声音。在这个项目中，你将使用ESP32控制无源蜂鸣器工作。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/8b2bc33166824a904168c38b960fe574.png)|![](./Arduino/media/6c3a06627faa0d87dd69cbd361929240.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|无源蜂鸣器*1|NPN型晶体管(S8050)*1|
|![](./Arduino/media/a487df5effb3b0ae28e7601cad88c97b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)| |
|1KΩ电阻*1|跳线若干|USB线*1| |

**3.元件知识：**

![](./Arduino/media/352568cc59e03453c9433f866631bf50.png)   

**无源蜂鸣器：** 它是一种内部没有振动源的集成电子蜂鸣器。它必须由2K-5K方波驱动，而不是直流信号。与有源蜂鸣器的外观非常相似，但是一个带有绿色电路板的蜂鸣器是无源蜂鸣器，而另一个带有黑色胶带的是有源蜂鸣器。无源蜂鸣器不能区分正极性而有源蜂鸣器是可以，如下图：

![](./Arduino/media/9e2535b132d6c88b45b2b8dfdf6dbda4.png)

**晶体管:** 请参考**项目12** 。

**4.项目接线图:**

![](./Arduino/media/9116a43de7b0f2dc1cdb0496468706f3.png)

**5.代码说明：**

![Img](./media/img-20241030112339.png)

向指定管脚关闭无源蜂鸣器，使蜂鸣器不发声。

![Img](./media/img-20241030112545.png)

向指定管脚设置无源蜂鸣器发声的音调和节拍。

![Img](./media/img-20241030112733.png)

向指定管脚设置无源蜂鸣器播放特定音乐。

**6.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：


1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241030113019.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 15  。

3. 先从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241030112927.png) ” ，管脚为 15 ，选择 “圣诞歌” ；再拖出 “ ![Img](./media/img-20241030113019.png) ” ，管脚为 15 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为2000毫秒。

5. 复制代码块 “ ![Img](./media/img-20241030113313.png) ” 1次，选择 “生日快乐歌” 。

完整代码：

![Img](./media/img-20241030112856.png)

**6.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：无源蜂鸣器播放音乐。

![](./Arduino/media/f602628b53d8dd59744d5405b604f8c6.png)





















## 项目14 小台灯

**1.项目介绍：**

你知道ESP32可以在你按下外接按键的时候点亮LED吗? 在这个项目中，我们将使用ESP32，一个按键开关和一个LED来制作一个迷你台灯。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/4c27c3e6c2224e12fd1bd298669f700c.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|按键*1|
|![](./Arduino/media/b3484a63586f907a33f23fa001c874ee.png)|![](./Arduino/media/e8726e55ebfb8e7520e615575ce89204.png)|![](./Arduino/media/11f324f82f890b0691f134e1ea7a3765.png)|
|10KΩ电阻*1|红色 LED*1|220Ω电阻*1|
|![](./Arduino/media/4214d58466508ada517d241d46485b7b.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|按键帽*1|跳线若干|USB 线*1|

**3.元件知识：**

![](./Arduino/media/50b8a411811e86cb4204a2e0377282f4.png)

**按键：** 按键可以控制电路的通断，把按键接入电路中，不按下按键的时候电路是断开的，

一按下按键电路就通啦，但是松开之后就又断了。可是为什么按下才通电呢？这得从按键的内部构造说起。没按下之前，电流从按键的一端过不去另一端；按下的时候，按键内部的金属片把两边连接起来让电流通过。

按键内部结构如图：![](./Arduino/media/013b1897a0308c71d7e5ed0eaf64198d.png)，未按下按键之前，1、2就是导通的，3、4也是导通的，但是1、3或1、4或2、3或2、4是断开（不通）的；只有按下按键时，1、3或1、4或2、3或2、4才是导通的。

在设计电路时，按键开关是最常用的一种元件。

**按键的原理图:**

![](./Arduino/media/00096ba2b3cb95b8d02e075261acb181.png)
  
**什么是按键抖动？**

我们想象的开关电路是“按下按键-立刻导通”“再次按下-立刻断开”，而实际上并非如此。
按键通常采用机械弹性开关，而机械弹性开关在机械触点断开闭合的瞬间（通常 10ms左右），会由于弹性作用产生一系列的抖动，造成按键开关在闭合时不会立刻稳定的接通电路，在断开时也不会瞬时彻底断开。

![](./Arduino/media/c4d829daa9d08e80d4538b901c700b8c.png)

**那又如何消除按键抖动呢？**

常用除抖动方法有两种：软件方法和硬件方法。这里重点讲讲方便简单的软件方法。
我们已经知道弹性惯性产生的抖动时间为10ms 左右，用延时命令推迟命令执行的时间就可以达到除抖动的效果。

所以我们在代码中加入了0.02秒的延时以实现按键防抖的功能。

![](./Arduino/media/3591ca9171277a78bf782c32525e1812.png)

**4.项目接线图：**

![](./Arduino/media/79c310407b3091e58739fda1c916f412.png)

<span style="color: rgb(255, 76, 65);">注意: </span>

怎样连接LED 

![](./Arduino/media/cbb16ef4d8cb62a4001d1a05ae3ac615.png)

怎样识别五色环220Ω电阻和五色环10KΩ电阻

![](./Arduino/media/951ce7d7778b34bf8fbdb3de1b8c3116.png)

![](./Arduino/media/2d3f0996515352c92c07d17e074e7308.png)

**5. 代码说明：**

![Img](./media/img-20241029162852.png)

从指定的数字管脚读取按键开关的数字信号(高/低电平)。

![Img](./media/img-20241115103741.png)

布尔型（bool）变量的值只有真 （true) 和假 （false）。 C++中如果值非零就为True,为零就是False。这里可以知道ledState初始值为0。

![Img](./media/img-20241115103826.png)

将ledState的当前值取反后再赋值给ledState本身。

![Img](./media/img-20241115103926.png)

这里延时的作用是软件方法消抖。按键机械触点断开、闭合时，由于触点的弹性作用，按键开关不会马上稳定接通或一下子断开，在闭合及断开的瞬间均伴随有一连串的抖动，为了不产生这种现象而作的措施就是按键消抖。代码中检测出键闭合后执行一个延时程序，10ms的延时，让前沿抖动消失后再一次检测键的状态，如果仍保持闭合状态电平，则确认为真正有键按下.

**6.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241028153152.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 4 ，设为 “低” 。

![Img](./media/img-20241028151723.png)

3. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028131724.png)” 放入 “![Img](./media/img-20241023140106.png)” 中，将 “ 整数 ” 改成 “布尔” ，“item” 改成 “ledState” ；再从 “![Img](./media/img-20241028132537.png)” 拖出 “![Img](./media/img-20241028132459.png)” 放入 “![Img](./media/img-20241028131724.png)”中，选择 “假”。

![Img](./media/img-20241028151759.png)

4. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241028135641.png)” ；接着从 “![Img](./media/img-20241028132537.png)” 拖出 “![Img](./media/img-20241028135823.png)” 放入 “![Img](./media/img-20241028135641.png)” 中；再从 “![Img](./media/img-20241029163044.png)” 拖出 “ ![Img](./media/img-20241028153403.png) ” 放入 “ = ” 左侧，管脚为 15 ；最后从 “![Img](./media/img-20241028132016.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “ = ” 右侧。

![Img](./media/img-20241028151832.png)

5. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为10毫秒。

![Img](./media/img-20241028151859.png)

6. 先复制代码块 “ ![Img](./media/img-20241028153518.png) ” 1次，将延时10毫秒改成200毫秒；再复制代码块 “ ![Img](./media/img-20241028153541.png) ” 1次，将数字 0 改成 1.

![Img](./media/img-20241028151951.png)

7. 复制代码块 “![Img](./media/img-20241028153708.png) ” 1次，将延时10毫秒移除，接着从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028142316.png)” ，再从 “ ![Img](./media/img-20241028132537.png) ” 拖出 “![Img](./media/img-20241028142433.png) ”，最后又从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241028142618.png) ”。

![Img](./media/img-20241028152022.png)

8. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241028153152.png) ” ，管脚为 4 ，又从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241028142618.png) ” 放入 “高” 处。

![Img](./media/img-20241028152103.png)

完整代码：

![Img](./media/img-20241029161821.png)


**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：按下按钮，LED亮起；当按钮松开时，LED仍亮着。再次按下按钮，LED熄灭；当按钮释放时，LED保持关闭。是不是很像个小台灯？

![](./Arduino/media/cba65f3e78fc23732983efae1f0441e4.png)



















## 项目15 模拟沙漏

**1.项目介绍：**

古代人没有电子时钟，就发明了沙漏来测时间，沙漏两边的容量比较大，在一边装了细沙，中间有个很小的通道，将沙漏直立，有细沙的一边在上方，由于重力的作用，细沙就会往下流通过通道到沙漏的另一边，当细沙都流到下边了，就倒过来，把一天反复的次数记录下来，第二天就可以通过沙漏反复流动的次数而知道这一天大概的时间了。这一课我们将利用ESP32控制倾斜开关和LED灯来模拟沙漏，制作一个电子沙漏。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/01c1502f7cc76c09d4d77410dcdd31a6.png)|![](./Arduino/media/b3484a63586f907a33f23fa001c874ee.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|倾斜开关*1|10KΩ电阻*1|
|![](./Arduino/media/e8726e55ebfb8e7520e615575ce89204.png)|![](./Arduino/media/11f324f82f890b0691f134e1ea7a3765.png)| ![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|
|红色 LED*4|220Ω电阻*1|跳线若干|USB 线*1|

**3.元件知识：**

![](./Arduino/media/966683cc81a185103df1862a16d7a844.png)

倾斜开关也叫数字开关或球形开关，里面有一个金属球。它用于检测小角度的倾斜。

原理很简单：当开关倾斜一定角度时，里面的球会向下滚动，接触到连接到外面引脚的两个触点，从而触发电路。否则，球将远离触点，从而断开电路。

这里用倾斜开关的内部结构来说明它是如何工作的，显示如下图：

![](./Arduino/media/ed8fb48d5fbce7033fad9ffa5de67808.png)

**4.项目接线图：**

![](./Arduino/media/02d5f7df75aa8062f7b9399a47ae4285.png)

<span style="color: rgb(255, 76, 65);">注意: </span>

怎样连接LED 

![](./Arduino/media/cbb16ef4d8cb62a4001d1a05ae3ac615.png)

怎样识别五色环220Ω电阻和五色环10KΩ电阻

![](./Arduino/media/951ce7d7778b34bf8fbdb3de1b8c3116.png)

![](./Arduino/media/2d3f0996515352c92c07d17e074e7308.png)

**5.代码说明：**

![Img](./media/img-20241030141328.png)

从指定的数字管脚读取倾斜开关的数字信号(高/低电平)。

**6.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”。

3. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028131724.png)” 放入 “![Img](./media/img-20241023140106.png)” 中；再从 “![Img](./media/img-20241024143857.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “![Img](./media/img-20241028131724.png)”中，将 “ 整数 ” 改成 “字节” ，将 “item” 改成 “switch_state” 。

![Img](./media/img-20241030141614.png)

4. 先从 “![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241030141123.png)” ，再从 “![Img](./media/img-20241029163044.png)” 拖出 “ ![Img](./media/img-20241030141504.png) ” ，管脚为 15 。

![Img](./media/img-20241030141846.png)

5. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “ ![Img](./media/img-20241030141723.png) ”，再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241030141816.png) ” 。

![Img](./media/img-20241030141906.png)

6. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241028135641.png)” ；接着从 “![Img](./media/img-20241028132537.png)” 拖出 “![Img](./media/img-20241028135823.png)” 放入 “![Img](./media/img-20241028135641.png)” 中；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241030141816.png) ”  放入 “ = ” 左侧 ；最后从 “![Img](./media/img-20241028132016.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “ = ” 右侧。

![Img](./media/img-20241030142059.png)

7. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241030142241.png) ” 放入 “ ![Img](./media/img-20241030142341.png) ”
，将从 1 到 10 步长为 1 改成从 16 到 19 步长为 1；又从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029171029.png) ” 放入 “ ![Img](./media/img-20241030142609.png) ”；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241024133651.png) ” 放入 “管脚 <span style="color: rgb(255, 76, 65);">0</span> ” 处 ；添加延时500毫秒。

![Img](./media/img-20241030142916.png)


8. 复制代码块 “ ![Img](./media/img-20241030142718.png) ” 1次，将 “ = ” 右侧的数字 <span style="color: rgb(0, 209, 0);">0</span> 改成 <span style="color: rgb(255, 169, 0);">1</span>，从 16 到 19 步长为 1 改成从 19 到 16 步长为 -1 ，“ 高 ” 改成 “ 低 ” 。

![Img](./media/img-20241030143114.png)


完整代码：

![Img](./media/img-20241030145405.png)

**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：将面包板倾斜到一定角度，led就会一个一个地亮起来。当回到上一个角度时，led会一个一个关闭。就像沙漏一样，随着时间的推移，沙子漏了出来。

![](./Arduino/media/2db9ee9bf59debc53c46aa954da31d47.png)

































## 项目16 I2C 128×32 LCD

**1.项目介绍：**

在生活中，我们可以利用显示器等模块来做各种实验。你也可以DIY各种各样的小物件。例如，用一个温度传感器和显示器做一个温度测试仪，或者用一个超声波模块和显示器做一个距离测试仪。下面，我们将使用LCD_128X32_DOT模块作为显示器，将其连接到ESP32控制板上。将使用ESP32主板控制LCD_128X32_DOT显示屏显示各种英文文字、常用符号和数字。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/c4b08ad87310ea27bc06383257cc7f8f.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|LCD_128X32_DOT*1|
|![](./Arduino/media/4191d5454859076aa2a6c069185be177.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)| |
|4P转杜邦线公单*1|USB 线*1| |

**3.元件知识：**

![](./Arduino/media/c4b08ad87310ea27bc06383257cc7f8f.png)

**LCD_128X32_DOT：** 一个像素为128*32的液晶屏模块，它的驱动芯片为ST7567A。模块使用IIC通信方式，它不仅可以显示英文字母、符号，还可以显示中文文字和图案。使用时，还可以在代码中设置，让英文字母和符号等显示不同大小。

**LCD_128X32_DOT原理图：**

![](./Arduino/media/a6f56f3c6481d37dc0dcf9cf74587781.png)

**LCD_128X32_DOT技术参数：**

显示像素：128*32 字符

工作电压：DC 5V

工作电流：100mA (5V)

模块最佳工作电压：5V

亮度、对比度可通过程序指令控制

**4.项目接线图：**

![](./Arduino/media/229ce4e1ad8b01c71577d8f777e8195b.png)

**5.代码说明：**

![Img](./media/img-20241029091418.png)

初始化LCD_128X32_DOT的管脚。

![Img](./media/img-20241029091523.png)

对LCD_128X32_DOT清屏

![Img](./media/img-20241029091630.png)

设置LCD_128X32_DOT显示内容的位置。

![Img](./media/img-20241029091724.png)

LCD_128X32_DOT显示字符串（数字，符号和字母等等）。

**6.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241029081006.png)” 分别拖出 “![Img](./media/img-20241029092015.png)” 和 “![Img](./media/img-20241029092035.png)” 放入 “![Img](./media/img-20241023140106.png)” 。

![Img](./media/img-20241029092104.png)

3. 从 “![Img](./media/img-20241029081006.png)” 分别拖出 “![Img](./media/img-20241029094759.png)” 和 “![Img](./media/img-20241029094851.png)” ，设置第 0 行第4，将字符串 abcd 改成 KEYESTUDIO 。

![Img](./media/img-20241029095149.png)

4. 复制代码块 “![Img](./media/img-20241029095316.png)” 3次，将（0，4）分别改成（1，0）、（2，0）、（3，0）；将字符串 KEYESTUDIO 分别改成 ABCDEFGHIJKLMNOPQR 、123456789+-*/<>=$@ 、%^&(){}:;'|?,.~\\[] 。

![Img](./media/img-20241029095601.png)

完整代码：

![Img](./media/img-20241029095635.png)

**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：128X32LCD模块显示屏第一行显示“KEYESTUDIO”、第二行显示“ABCDEFGHIJKLMNOPQR”、第三行显示“123456789+-*/<>=$@”、第四行显示“%^&(){}:;'|?,.~\\[]”。

![](./Arduino/media/eeada568b7ef98fefa27e9f22435befd.png)


























## 项目17 小风扇

**1.项目介绍：** 

在炎热的夏季，需要电扇来给我们降温，那么在这个项目中，我们将使用ESP32控制直流电机和小扇叶来制作一个小电扇。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/dae45d195fded43701882b0f36f21b98.png)|![](./Arduino/media/c562656c96657983e724daed7c8d6202.png)|![](./Arduino/media/3cc5c242c0f357b3dc496037a7d8bae8.png)|
| :--: | :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|直流电机*1|面包板专用电源模块*1|6节5号电池盒*1|
|![](./Arduino/media/6c3a06627faa0d87dd69cbd361929240.png)|![](./Arduino/media/6c3a06627faa0d87dd69cbd361929240.png)|![](./Arduino/media/d23956651d15073e880387c5a5419d80.png)|![](./Arduino/media/e6fc7ef2600a1bc1fe16301855b52f84.png)|![](./Arduino/media/ed228ff5627e0c8cc0c79fa04f1d4d16.png)|
|NPN型晶体管(S8050)*1|PNP型晶体管(S8550)*1|1KΩ 电阻*1|二极管*1|三叶软桨*1|
|![](./Arduino/media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![](./Arduino/media/4c49cdffc9e5e6f1aad838120d35897a.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)| | |
|跳线若干|5号电池(<span style="color: rgb(255, 76, 65);">自备</span>)*6|USB 线*1| | |

**3.元件知识:**

**二极管：** 它是用半导体材料(硅、硒、锗等)制成的一种电子器件。它有两个电极，正极，又叫阳极；负极，又叫阴极，给二极管两极间加上正向电压时，二极管导通， 加上反向电压时，二极管截止。 二极管的导通和截止，则相当于开关的接通与断开。

灰色圈一端为负极(<span style="color: rgb(255, 76, 0);">**-**</span>)，则另一端为正极(<span style="color: rgb(255, 76, 0);">**+**</span>)，如下图所示：

![](./Arduino/media/1a0eeedb91bbad682badb3f1884ef050.png)

二极管具有单向导电性能，导通时电流方向是由阳极通过管子流向阴极。

**面包板专用电源模块：**

![](./Arduino/media/c562656c96657983e724daed7c8d6202.png)

**说明：**

此模块，能方便的给面包板提供3.3V和5V的电源，具有DC2.1输入（DC7－12V），另外，具备USB Type C接口的电源输入。

**规格：** 

 输入电压：DC座：7-12V；  Type C USB：5V 

 电流：3.3V：最大500mA；        5V：最大500mA；

 最大功率: 2.5W

 尺寸: 53mmx26.3mm

 环保属性: ROHS

**接口说明：**

![](./Arduino/media/9ab1fa7ff5eccecdc0fe6218fad6df79.png)

**原理图：**

![](./Arduino/media/5139ee652d196f215b53c35d8ab24166.png)

**4. 项目接线图1：**

<span style="color: rgb(255, 76, 65);">（这个实验是使用S8050（NPN型晶体管）控制电机）</span>

![](./Arduino/media/bff2df6024667c53eee4f26a7b074911.png)

(<span style="color: rgb(255, 76, 65);">注: 先接好线，然后在直流电机上安装一个小风扇叶片。</span>)

**5. 项目代码1：**

你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “ ![Img](./media/img-20241101165449.png) ” 拖出 “ ![Img](./media/img-20241101165534.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 15 ，设为 “低” 。

3. 从 “ ![Img](./media/img-20241101165500.png) ” 拖出 “ ![Img](./media/img-20241101165542.png) ” ，管脚为 15 ，设为 “高” 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为4000毫秒。

5. 复制代码块 “ ![Img](./media/img-20241101165628.png) ” 1 次，将 “高” 改为 “低” ，4000 毫秒改成 2000毫秒 。

完整代码：

![Img](./media/img-20241101165406.png)


**6. 项目现象1：**

编译并上传代码到ESP32，代码上传成功后，外接电源，上电后，你会看到的现象是：电机转动4秒，停止2秒，以此规律重复执行。

![](./Arduino/media/3fa9f68a6dae4cc181e84774f7ba3db4.png)


**7. 项目接线图2：**

<span style="color: rgb(255, 76, 65);">（这个实验是使用S8550（PNP型晶体管）控制电机）</span>

![](./Arduino/media/48132a2a51ed288bd3329358690883b3.png)

(<span style="color: rgb(255, 76, 65);">注: 先接好线，然后在直流电机上安装一个小风扇叶片。</span>)

**8. 项目代码2：**

![Img](./media/img-20241101170221.png)

**9. 项目现象2：**

编译并上传代码到ESP32，代码上传成功后，外接电源，上电后，你会看到的现象是：电机转动4秒，停止2秒，以此规律重复执行。

![](./Arduino/media/8fc203e455a610033b39ef535e470c6c.png)


## 项目18 调光灯

**1.项目介绍：**

电位器是一个带有滑动或旋转触点的三端电阻器，它形成一个可调的分压器。它的工作原理是在均匀电阻上改变滑动触点的位置。在电位器中，整个输入电压被施加到电阻的整个长度上，输出电压是固定触点和滑动触点之间的电压值。在这个项目中，我们将学习使用ESP32读取电位器的值，并结合LED制作一个调光灯。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/75c2400a88559cf22295c22147625d98.png)|![](./Arduino/media/e8726e55ebfb8e7520e615575ce89204.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|可调电位器*1|红色 LED*1|
|![](./Arduino/media/11f324f82f890b0691f134e1ea7a3765.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|![](./Arduino/media/4107849550a2c6d09592b2a28e291b54.png) | |  
|220Ω电阻*1|USB 线*1|跳线若干 | |

**3.元件知识：**

![](./Arduino/media/4a10a2fa7d595fb2683977c08657de34.png)

**可调电位器：** 可调电位器是电阻和模拟电子元件的一种，具有0和1两种状态(高电平和低电平)。模拟值不同，其数据状态呈现为1 ~ 1024等线性状态。

**ADC：** ADC是一种电子集成电路，用于将模拟信号(如电压)转换为由1和0组成的数字或二进制形式。我们在ESP32上的ADC的范围是12位，这意味着分辨率是2^12=4096，它表示一个范围(3.3V)将被平均划分为4096份，模拟值的范围对应于ADC值。因此，ADC拥有的比特越多，模拟的分区就越密集，最终转换的精度也就越高。

 ![](./Arduino/media/8f067a222c20bd1a949bb504f34df15d.png)

分节1:0V—(3.3/4095)V 范围内的模拟量对应数字0;

分节2:(3.3/4095)V—2*(3.3/4095)V 范围内的模拟量对应于数字1;

......

下面的模拟将被相应地划分。换算公式如下：

![](./Arduino/media/66f4a644cdb895d4a7910a3f1ac90ccd.png)

**DAC：** 这一过程的可逆需要DAC，数字到模拟转换器。数字I/O端口可以输出高电平和低电平(0或1)，但不能输出中间电压值，这就是DAC有用的地方。ESP32有两个8位精度的DAC输出引脚GPIO25和GPIO26，可以将VCC(这里是3.3V)分成2^8=256个部分。例如，当数字量为1时，输出电压值为3.3/256×1V，当数字量为128时，输出电压值为3.3/256 ×128=1.65V, DAC的精度越高，输出电压值的精度就越高。

换算公式如下：

![](./Arduino/media/0412cb6efce5c1d33e84aeac0931c402.png)

**ESP32主板上的ADC：** 

ESP32有16个引脚，可以用来测量模拟信号。GPIO引脚序列号和模拟引脚定义如下表所示：

![](./Arduino/media/6e8bbcdf34c3bca663c73236fbb3f83f.png)

**ESP32主板上的DAC：**

![](./Arduino/media/379d9c501ea4dfc829b6b52dba5a13e7.png)

**4.读取电位器的模拟值：**

我们将电位器连接到ESP32的模拟IO口上来读取电位器的模拟值。接线请参照以下接线图：

![](./Arduino/media/669570530b1f544aea810426eff2c4c3.jpg)


**代码说明：**

![Img](./media/img-20241031092741.png)

从指定的模拟管脚读取旋转电位器的模拟信号，模拟信号的范围为：0 ~ 4095 。

详细了解请参考链接：[https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html](https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html) 。

![Img](./media/img-20241031101130.png)

将旋转电位器的模拟信号（0 ~ 4095）映射给LED的亮度（0 ~ 255）。


你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 115200 。

3. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ；接着从 “ ![Img](./media/img-20241029151343.png) ” 拖出 “ ![Img](./media/img-20241031095329.png) ”，管脚为 36 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029134512.png)”，设置延时为100毫秒。

完整代码：

![Img](./media/img-20241031095447.png)

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，单击图标![Img](./media/img-20241023142105.png)进入串行监视器，设置波特率为115200。可以看到的现象是：串口监视器窗口将打印出电位器的模拟值，转动电位器手柄时，模拟值发生变化。

![Img](./media/img-20241031100100.png)


**5.调光灯的接线图：**

在前面一步，我们读取了电位器的模拟值，现在我们需要将电位器的ADC值转换成LED的亮度，来做成一个亮度可调的灯。见如下所示接线图：

![](./Arduino/media/231f15fcdc1a50e5847ca582872499b6.jpg)

**6.项目代码：**

![Img](./media/img-20241031101050.png)

**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：转动电位器手柄，LED的亮度会相应地改变。

![](./Arduino/media/9bb5d9041ac5f0d5a4b20b31291457e6.png)















## 项目19 火焰警报器

**1.项目介绍：**

火灾是一种可怕的灾害，火灾报警系统在房屋，商业建筑和工厂中是非常有用的。在本项目中，我们将使用ESP32控制火焰传感器，蜂鸣器和LED来模拟火灾报警装置。这是一个有意义的创客活动。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/41b3d98fdbcbfb06e20591b80a03d586.png)|![](./Arduino/media/e8726e55ebfb8e7520e615575ce89204.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|火焰传感器*1|红色 LED*1|
|![](./Arduino/media/a802ce7dc086858873e587c19b45578d.png)|![](./Arduino/media/11f324f82f890b0691f134e1ea7a3765.png)|![](./Arduino/media/a225cd286d071225ea0261768ac3f418.png)|![](./Arduino/media/4107849550a2c6d09592b2a28e291b54.png) |
|有源蜂鸣器*1|220Ω电阻*1|10KΩ电阻*1|跳线若干 |
|![](./Arduino/media/6c3a06627faa0d87dd69cbd361929240.png)|![](./Arduino/media/d23956651d15073e880387c5a5419d80.png)|![](./Arduino/media/2266d29566a875c35c2bd4be3e4a23f8.png)| |
|NPN型晶体管(S8050)*1|1kΩ 电阻*1 |USB 线*1| |

**3.元件知识：**

![](./Arduino/media/41b3d98fdbcbfb06e20591b80a03d586.png)

**火焰传感器（红外接收三极管）：** 火焰会发出一定程度的IR光，这种光人眼是看不到的，但我们的红外接收三极管可以检测到它，并提醒微控制器（如ESP32）已经检测到火灾。红外接收三极管可以探测火焰，然后将火焰亮度转换为波动水平信号。红外接收三极管的短引脚是负极，另一个长引脚是正极。我们应该连接短引脚（负极)到5V，连接长引脚(正极)到模拟引脚，一个电阻和GND。如下图所示：

![](./Arduino/media/dde086c54e0343400582892ae91d818a.png)

<span style="color: rgb(255, 76, 65);">注意：</span>火焰传感器应避开日光、汽车头灯、白炽灯直接照射，也不能对着热源(如暖气片、加热器)或空调，以避免环境温度较大的变化而造成误报。同时还易受射频辐射的干扰。

**4.读取火焰传感器的模拟值：**

我们首先用一个简单的代码来读取火焰传感器的模拟值并打印出来。接线请参照以下接线图：

![](./Arduino/media/5c151d185e7967e77ff4a8d3e17331f2.png)

**代码说明：**

![Img](./media/img-20241031102454.png)

从指定的模拟管脚读取火焰传感器的模拟信号，模拟信号的范围为：0 ~ 4095 。

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 115200 。

3. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ；接着从 “ ![Img](./media/img-20241031102743.png) ”，管脚为 36 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029134512.png)”，设置延时为100毫秒。

完整代码：

![Img](./media/img-20241031102823.png)

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，单击图标![Img](./media/img-20241023142105.png)进入串行监视器，设置波特率为<span style="color: rgb(255, 76, 65);">115200</span>。可以看到的现象是：串口监视器窗口将打印火焰传感器读取的模拟值，当火焰靠近火焰传感器时，模拟值增大；反之，模拟值减小。

![Img](./media/img-20241031100100.png)


**5.火焰报警的接线图：**

接下来，我们将使用火焰传感器和蜂鸣器、LED制作一个有趣的项目——火灾报警装置。当火焰传感器检测到火焰时，LED闪烁，蜂鸣器报警。

![](./Arduino/media/056501565145dc46ce00dfb750d87e9f.png)

**6.项目代码：**

（<span style="color: rgb(255, 76, 65);">注意：代码中的阀值500可以根据实际情况自己重新设置</span>）

![Img](./media/img-20241031104132.png)

**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：当火焰传感器检测到火焰时，LED闪烁，蜂鸣器报警；否则，LED不亮，蜂鸣器不响。

![](./Arduino/media/1790b8a741eea4def3eac4e122049b01.png)











## 项目20 小夜灯

**1.项目介绍：**

传感器或元件在我们的日常生活中是无处不在的。例如，一些公共路灯在晚上会自动亮起，而在白天会自动熄灭。为什么呢? 事实上，这些都是利用了一种光敏元件，可以感应外部环境光强度的元件。晚上，当室外亮度降低时，路灯会自动打开；到了白天，路灯会自动关闭。这其中的原理是很简单的，在本实验中我们使用ESP32控制LED就来实现这个路灯的效果。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/72c1149c0cbd940aa8cf2356ba75ce6b.png)|![](./Arduino/media/e8726e55ebfb8e7520e615575ce89204.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|光敏电阻*1|红色 LED*1|
|![](./Arduino/media/11f324f82f890b0691f134e1ea7a3765.png)|![](./Arduino/media/a225cd286d071225ea0261768ac3f418.png)|![](./Arduino/media/4107849550a2c6d09592b2a28e291b54.png) |![](./Arduino/media/2266d29566a875c35c2bd4be3e4a23f8.png)|
|220Ω电阻*1|10KΩ电阻*1|跳线若干 |USB 线*1|

**3.元件知识：**

![](./Arduino/media/72c1149c0cbd940aa8cf2356ba75ce6b.png)

光敏电阻：是一种感光电阻，其原理是光敏电阻表面上接收亮度(光)降低电阻，光敏电阻的电阻值会随着被探测到的环境光的强弱而变化。有了这个特性，我们可以使用光敏电阻来检测光强。光敏电阻及其电子符号如下：

![](./Arduino/media/1905cf730948d3735f192c184361e2a2.png)

下面的电路是用来检测光敏电阻电阻值的变化：

![](./Arduino/media/7ad49eab2d60085716bb365d33f055bd.png)

在上述电路中，当光敏电阻的电阻因光强的变化而改变时，光敏电阻与电阻R2之间的电压也会发生变化。因此，通过测量这个电压就可以得到光的强度。本项目是采用上图左边的电路来接线的。 

**4.读取光敏电阻的模拟值：**

我们首先用一个简单的代码来读取光敏电阻的模拟值并打印出来。接线请参照以下接线图：

![](./Arduino/media/c19e5b58e073c49a22dd0fdfdb38d7f7.png)

**代码说明：**

![Img](./media/img-20241031104844.png)

从指定的模拟管脚读取光敏电阻的模拟信号（光照强度），模拟信号的范围为：0 ~ 4095 。

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 115200 。

3. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ；接着从 “ ![Img](./media/img-20241031104946.png) ”，管脚为 36 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029134512.png)”，设置延时为100毫秒。

完整代码：

![Img](./media/img-20241031105042.png)

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，单击图标![Img](./media/img-20241023142105.png)进入串行监视器，设置波特率为<span style="color: rgb(255, 76, 65);">115200</span>。可以看到的现象是：串口监视器窗口将打印光敏电阻读取的模拟值，当逐渐减弱光敏电阻所处环境中的光线强度时，模拟值逐渐增大；反之，模拟逐渐减小。

![Img](./media/img-20241031100100.png)


**5.光控灯的接线图：**

我们在前面做了一个小小的调光灯，现在我们来做一个光控灯。它们的原理是相同的，即通过ESP32获取传感器的模拟值，然后调节LED的亮度。

![](./Arduino/media/eac0e08c0dde6b435907827d36eb1957.png)

**6.项目代码：**

![Img](./media/img-20241031105419.png)

**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：当减弱光敏电阻所处环境中的光线强度时，LED变亮，反之，LED变暗。

![](./Arduino/media/b640e71ba0840d6f99fb089ab248ca4f.png)













## 项目21 温度仪表

**1.项目介绍：**

热敏电阻是一种电阻，其阻值取决于温度和温度的变化，广泛应用于园艺、家庭警报系统等装置中。因此，我们可以利用这一特性来制作温度计。

**2.项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/a2aa343488c11843f13ae0413547c673.png)|![](./Arduino/media/c4b08ad87310ea27bc06383257cc7f8f.png)|![](./Arduino/media/4b024c34465b366d3067277b397e5fc0.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|LCD_128X32_DOT*1|热敏电阻*1|
|![](./Arduino/media/a225cd286d071225ea0261768ac3f418.png)|![](./Arduino/media/4191d5454859076aa2a6c069185be177.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)| ![](./Arduino/media/4107849550a2c6d09592b2a28e291b54.png) |
|10KΩ电阻*1|4P转杜邦线公单*1|USB 线*1|跳线若干 |


**3.元件知识：**

**热敏电阻：** 热敏电阻是一种温度敏感电阻。当热敏电阻感应到温度的变化时，它的电阻就会发生变化。我们可以利用热敏电阻的这种特性来检测温度强度。热敏电阻及其电子符号如下所示。

![](./Arduino/media/4da14068ab4c20e5e807fdd08a82466f.png)

热敏电阻的电阻值与温度的关系为：

![](./Arduino/media/4efb34b50f2cdb5b2ed6f351ce475474.png)

式中：

Rt为热敏电阻在T2温度下的电阻；

R为热敏电阻在T1温度下的标称阻值；

EXP[n]是e的n次幂；

B为温度指数；

T1，T2是开尔文温度(绝对温度)，开尔文温度=273.15 +摄氏温度。对于热敏电阻的参数，我们使用：B=3950, R=10KΩ，T1=25℃。热敏电阻的电路连接方法与光敏电阻类似，如下所示：

![](./Arduino/media/1ac82d185d19f35348be2eec7717d721.png)

我们可以利用ADC转换器测得的值来得到热敏电阻的电阻值，然后利用公式来得到温度值。因此，温度公式可以推导为：

![](./Arduino/media/7a610a5fe8f27e2000432bcef2f765e9.png)

**4.读取热敏电阻的值：**

首先我们学习热敏电阻读取当前的ADC值、电压值和温度值并将其打印出来。请按下面的接线图接好线：

![](./Arduino/media/aa12d903640a4b579c986272f0f7e163.png)

**代码说明：**

![Img](./media/img-20241029135544.png)

读取模拟温度传感器(热敏电阻)的温度值。


你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 115200 。

3. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029130617.png) ” ；接着从 “![Img](./media/img-20241104104046.png)” 拖出  “![Img](./media/img-20241104104112.png)” ；将 “自动换行” 改成 “不换行” ，“hello” 改成 “Temperature: ” 。

4. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029130617.png) ” ；接着从 “![Img](./media/img-20241029135740.png)” 拖出  “![Img](./media/img-20241029135820.png)” ，管脚为 36 ；将 “自动换行” 改成 “不换行” 。
 
5. 复制代码块 “ ![Img](./media/img-20241104104423.png)” 1次，将 “不换行” 改成 “自动换行” ，“Temperature: ” 改成 “ ℃ ” ；再从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029134512.png)”，设置延时为100毫秒。

完整代码：

![Img](./media/img-20241029140146.png)

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，单击图标![Img](./media/img-20241023142105.png)进入串行监视器，设置波特率为<span style="color: rgb(255, 76, 65);">115200</span>。你会看到的现象是：串口监视器窗口将不断显示热敏电阻检测到当前环境中的温度值。试着用食指和拇指捏一下热敏电阻(不要碰触导线)一小段时间，你应该会看到温度值增加。

![Img](./media/img-20241029140606.png)


**5.温度仪表的接线图：**

![](./Arduino/media/5b77fc42f5fa8ab213447116da53f777.png)

**6.项目代码：**

![Img](./media/img-20241101132226.png)

**7.项目现象：**

编译并上传代码到ESP32，代码上传成功后，利用USB线上电，你会看到的现象是：LCD 128X32 DOT的屏幕上显示热敏电阻的电压值和当前环境中的温度值。

![Img](./media/073463d882655fe6ab03fdf8ed4c537b.png)








## 项目22 蓝牙

本章主要介绍如何通过ESP32的蓝牙与手机进行简单的数据传输。项目22.1 是常规蓝牙，项目22.2 是蓝牙控制LED。

**项目22.1 常规蓝牙**

**1. 项目元件：**

|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|![](./Arduino/media/b4421594adeb4676d63581a1047c6935.png)|![](./Arduino/media/4d0be04892e2038c372f82caba521f64.png)|
| :--: | :--: |:--: |
| ESP32*1 | USB 线*1 |智能手机/平板电脑（<span style="color: rgb(255, 76, 65);">自备</span>）*1|

在本项目中，我们需要使用一个名为串口蓝牙终端的蓝牙应用程序来协助实验。如果您还没有安装它，请点击安装：[https://www.appsapk.com/serial-bluetooth-terminal/](https://www.appsapk.com/serial-bluetooth-terminal/) 。

下面是它的标志。

![](./Arduino/media/4d6bebf2b0859865e28b426bd3477fac.png)

**2.元件知识：**

蓝牙是一种短距离通信系统，可分为两种类型，即低功耗蓝牙(BLE)和经典蓝牙。简单的数据传输有两种模式：主模式和从模式。

**主模式：** 在这种模式下，工作在主设备上完成，并且可以与从设备连接。我们可以搜索和选择附近的从设备来连接。当设备在主模式下发起连接请求时，需要其他蓝牙设备的地址和配对密码等信息。配对完成后，可直接与它们连接。

**从模式：** 处于从模式的蓝牙模块只能接受来自主机的连接请求，但不能发起连接请求。与主机设备连接后，可以向主机设备发送数据，也可以从主机设备接收数据。蓝牙设备之间可以进行数据交互，一个设备处于主模式，另一个设备处于从模式。当它们进行数据交互时，处于主模式的蓝牙设备会搜索并选择附近要连接的设备。在建立连接时，它们可以交换数据。当手机与ESP32进行数据交换时，手机通常处于主模式，ESP32为从模式。

![](./Arduino/media/086194049ec20b12b1a7cda437023331.png)

**3.项目接线：**

使用USB线将ESP32主板连接到电脑上的USB口。

![](./Arduino/media/46cf3a8a1c79e456ac0f02da5ef38aec.png)

**4.项目代码：**

**<span style="color: rgb(255, 76, 65);">提醒：</span>** 此代码从 “ ![Img](./media/img-20241101140602.png) ”  一起拖出，将 “ ESP32BT ” 改成 “ ESP32test ” 即可。

![Img](./media/img-20241101140501.png)

**5.项目现象：**

编译并上传代码到ESP32，上传成功后，打开串行监视器，波特率设置为<span style="color: rgb(255, 76, 65);">115200</span>。当您看到串行打印出字符串，如下所示，表示ESP32的蓝牙已就绪，等待与手机连接。(如果打开串口监视器且设置波特率为115200之后，串口监视器窗口没有显示如下信息，可以按下ESP32的复位键![](./Arduino/media/515a31c10d414cae43980905e7df1879.jpg)）

![](./Arduino/media/d0a0c882ace0c67de3ee19b193da139b.png)

请确认你的手机已开启手机蓝牙，且已安装“**串口蓝牙终端**”的蓝牙应用程序。

![](./Arduino/media/a934651544f086913a236e35568f7cd3.png)

![](./Arduino/media/4959397f4ab4f8f2e4c06ad6f29573a0.png)

手机自动搜索附近的蓝牙设备，点击“ESP32 test”进行配对，出现配对对话框，点击“**配对**”，这样“ESP32 test”设备就连接好了。

![](./Arduino/media/d20253dd32917c9854ba20039af99f2d.png)

![](./Arduino/media/2c2aad793f4aa811e5bcc90cd303db85.png)

![](./Arduino/media/8d2671b30598c93329ac52ad6d757f60.png)

打开软件APP，点击终端左侧。选择 "Devices"。

![](./Arduino/media/48b660760c72d0e5ed654a8265875d16.png)

![](./Arduino/media/72831d7e8b780025c88537b3236bfca3.png)

选择经典蓝牙模式下的ESP32test，会出现如下图所示的连接成功提示。

![](./Arduino/media/6e718c2e2c99c80c557b5c4941305a7d.png)

![](./Arduino/media/023dba247c7da46105e2d68363ee443c.png)

现在，数据可以通过ESP32在你的手机和电脑之间传输。

在IDE中的文本框输入“Hi!”,当手机收到它的时候，给你的手机回复“Hi!”；手机发送“Hello!”，当电脑收到它的时候，给你的电脑回复“Hello!”。

![Img](./media/img-20241101135753.png)

![](./Arduino/media/cbce154e5bbe1dc985183b3ed2125191.png)


## 项目23 WiFi 工作模式

在如今科技高速发展的时代，人们的生活质量越来越好，生活节奏越来越快，开始有人觉得复杂多样的智能化设备控制起来十分麻烦，通过手机统一控制智能化设备这种方法逐渐得到了人们的青睐。这种方法是利用单片机通过wifi模块和Internet网络建立手机和智能化设备之间的连接以此来实现对智能化设备的远程控制。在本章中，我们将重点关注ESP32的WiFi基础设施。ESP32有3种不同的WiFi工作模式：Station模式、AP模式和AP+Station模式。所有WiFi编程项目在使用WiFi前必须配置WiFi运行模式，否则无法使用WiFi。

<span style="background: rgb(255, 251, 0);">**<span style="color: rgb(255, 76, 65);">特别提醒：在本项目中，只讲解 ESP32 的 WiFi Station 模式</span>**。</span>

**项目23.1: WiFi Station 模式**

**1.实验元件：**

|![](./Arduino/media/2266d29566a875c35c2bd4be3e4a23f8.png)|![](./Arduino/media/afc52f6616725ba37e3b12a2e01685ad.png)|
| :--: | :--: |
| USB 线 x1|ESP32x1|

**2.实验接线：**

使用USB线将ESP32主板连接到电脑上的USB口。

![](./Arduino/media/3e0498944fc51e44b30bb90e2ae86b35.png)

**3.元件知识：**

**Station 模式：** 当ESP32选择Station模式时，它作为一个WiFi客户端。它可以连接路由器网络，通过WiFi连接与路由器上的其他设备通信。如下图所示，PC和路由器已经连接，ESP32如果要与PC通信，需要将PC和路由器连接起来。

![](./Arduino/media/227039c89f94a5ffbc04bca9f9e61e40.png)


**4.项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “ ![Img](./media/img-20241023140218.png)” 拖出 “ ![Img](./media/img-20241023140243.png) ” 放入 “ ![Img](./media/img-20241023140106.png) ” ，设置波特率为 115200 。

3. 从 “![Img](./media/img-20241105083758.png)” 拖出 “![Img](./media/img-20241105083837.png)” 。

完整代码：

![Img](./media/img-20241105090857.png)

<span style="background: rgb(255, 251, 0);"><span style="color: rgb(255, 76, 65);">特别提醒：由于各地的WiFi名称和密码是不同，所以在程序代码运行之前，用户需要在下图所示的框中输入你们自己的WiFi名称和密码</span>。</span>

![Img](./media/img-20241105083150.png)

**5.项目现象：**

确认正确输入自己的WiFi名称和密码后，编译并上传代码到ESP32主板，上传成功后，单击图标![Img](./media/img-20241023142105.png)进入串行监视器，设置波特率为<span style="color: rgb(255, 76, 65);">115200</span>。当ESP32成功连接到WiFi时，串行监视器将打印出WiFi分配给ESP32的IP地址。然后串口监视器窗口将显示如下：(如果打开串口监视器且设置波特率为115200之后，串口监视器窗口没有显示如下信息，可以按下ESP32的复位键![](./Arduino/media/515a31c10d414cae43980905e7df1879.jpg)）

![Img](./media/img-20241105090946.png)

